package analisador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

@ManagedBean(name = "lexicoBean")
@SessionScoped
public class LexicoBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private LexicoModel lexicoModel;
	private Set<String> palavraList;
	private String palavra;
	private String estadoAtual;
	private List<String> proxLetras;

	public String getPalavra() {
		return palavra;
	}

	public void setPalavra(String palavra) {
		this.palavra = palavra;
	}

	public Set<String> getPalavraList() {
		if (this.palavraList == null) {
			this.palavraList = new LinkedHashSet<String>();
		}
		return palavraList;
	}

	public void setPalavraList(Set<String> palavraList) {
		this.palavraList = palavraList;
	}

	public LexicoModel getLexicoModel() {
		if (this.lexicoModel == null) {
			this.lexicoModel = new LexicoModel();
		}
		return lexicoModel;
	}

	public void setLexicoModel(LexicoModel lexicoModel) {
		this.lexicoModel = lexicoModel;
	}

	public void setEstadoAtual(String estadoAtual) {
		this.estadoAtual = estadoAtual;
	}

	public String getEstadoAtual() {
		return estadoAtual;
	}

	public List<String> getProxLetras() {
		if (this.proxLetras == null) {
			this.proxLetras = new ArrayList<String>();
		}
		return proxLetras;
	}

	public void setProxLetras(List<String> proxLetras) {
		this.proxLetras = proxLetras;
	}

	public void inserePalavra() {
		String palavra = getPalavra().trim().replaceAll("[^A-Za-z]", "");
		System.out.println(palavra);
		if (palavra.length() > 0) {
			getPalavraList().add(palavra);
		}
		setPalavra("");
		geraAutomato(getPalavraList());
	}

	public void removePalavra(String palavra) {
		getPalavraList().remove(palavra);
		geraAutomato(getPalavraList());
	}

	public void verificaPalavra() {
		String palavra = getPalavra().trim();
		boolean valida = getLexicoModel().verificaPalavra(palavra);
		if (valida) {
			FacesContext.getCurrentInstance().addMessage("success", new FacesMessage("Palavra Correta!"));
		} else {
			setEstadoAtual("0");
			FacesContext.getCurrentInstance().addMessage("error", new FacesMessage("Palavra Incorreta!"));
		}
		setPalavra("");
	}

	public void geraAutomato(Set<String> lista) {
		getLexicoModel().limpaAutomato();
		for (String palavra : lista) {
			getLexicoModel().inserePalavra(palavra);
		}
	}

	public List<String> getLinhas() {
		return getLexicoModel().getLinhas();
	}

	public List<String> getColunas(String indice) {
		Integer index = Integer.parseInt(indice.replaceAll("\\D", ""));
		return getLexicoModel().getColunas(index);
	}

	public void geraEstadoAtual() {
		setEstadoAtual(getLexicoModel().getEstadoAtual(getPalavra()).toString());
	}

	public void geraProxLetras() {
		setProxLetras(getLexicoModel().getProxLetras());
	}

}
